use std::fs;
use std::time::{SystemTime, Duration};
use log::{info,error};
use std::path::PathBuf;
use structopt::StructOpt;
/**
* 用于删除指定目录下的文件
*/
fn main() {
    let cmd = Cmd::from_args();

    if !fs::metadata(&cmd.log_config).is_ok() {
        println!("{:?} 日志配置文件不存.",&cmd.log_config);
        return;
    }


    log4rs::init_file(&cmd.log_config, Default::default()).unwrap();

    // 设置要清理的目录
    let path = &cmd.folder;

    // 检查是否是目录
    if !path.exists() || !path.is_dir() {
        // 该目录不存在或不是目录。
        error!("目录不存在或不是目录 {:?}",path);
        return;
    }

    // 获取当前时间
    let now = SystemTime::now();
    // 计算 要删除多少 天前的文件
    let ten_days_ago = now - Duration::from_secs(&cmd.day_old * 24 * 60 * 60);

    // 要删除文件的类型 默认值 *
    let file_types = cmd.file_type;


    // 遍历目录中的所有文件
    if let Ok(entries) = fs::read_dir(path) {
        for entry in entries {
            if let Ok(entry) = entry {
                let metadata = entry.metadata().unwrap();
                let modified_time = metadata.modified().unwrap();

                let  mut file_type_ok = true;

                let entry_path = entry.path().extension().unwrap().to_str().unwrap().to_string();

                if file_types == "*" {
                    // 删除
                    file_type_ok = true;
                }else if !file_types.contains(&entry_path){
                    // 不删除
                    file_type_ok = false;
                }


                // 检查文件是否比 10 天前更老
                if (modified_time < ten_days_ago) && file_type_ok  {
                    let file_path = entry.path();
                    info!("删除文件: {:?}",file_path);
                    if let Err(e) = fs::remove_file(file_path) {
                        error!("删除文件失败: {:?}", e);
                    }
                }

            }
        }
    }

}

#[derive(Debug, StructOpt)]
#[structopt(name = "delOldFiles", about = "删除不再使用的文件.")]
pub struct Cmd {

    // 目录
    #[structopt(name="folder",short="f",long="folder",parse(from_os_str),help = "目录")]
    folder:PathBuf,

    // 要删除多少天前的文件
    #[structopt(name="day",short="d",long="day",default_value = "0",help = "要删除多少天前的文件,默认为当前时间之前的文件！")]
    day_old:u64,

    // 要删除的文件类型,多个类型用“,”分号隔开！
    #[structopt(name="type",short="t",long="type",default_value = "*",help = "要删除的文件类型,多个类型用“,”分号隔开！默认为所有类型文件")]
    file_type:String,

    // 日志配置文件路径,默认为 ./log.yml
    #[structopt(name="log",short="l",long="log",default_value = "log.yml",help = "日志配置文件路径,默认为 ./log.yml")]
    log_config:String,
}


